/*
 *
 * SeguridadDAL.java
 * Copyright(c) 2013 UcentralSoft, Todos los derechos reservados 
 */
package controlador;

import modelo.*;
import java.sql.*;
import java.util.*;

/**
 * Maneja el acceso a los datos de seguridad del sistema
 *
 * @version 1.0 [2013/10/13]
 * @author Jorge Barrera
 */
public class SeguridadDAL {

    /**
     * Instancia del acceso a datos
     */
    public IDAL dataAcces;

    /**
     * Constructor de la clase
     *
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public SeguridadDAL() throws ClassNotFoundException, SQLException {
        dataAcces = DALFactory.DALFactoryMethod(DBServer.MySQl);
    }

    /**
     * Permite obtener el usuario por login
     *
     * @param login
     * @return Usuario
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public Usuario ConsultarUsuarioPorLogin(String login) throws ClassNotFoundException, SQLException {
        Usuario usuario = new Usuario();
        ResultSet dataSet = dataAcces.getData("SELECT id, identificacion, nombres, apellidos, login, password, idrol, activo\n" + "FROM usuario\n" + "WHERE login = '" + login.trim() + "' AND activo");
        while (dataSet.next()) {
            usuario.setId(dataAcces.getResultSet().getInt(1));
            usuario.setIdentificacion(dataAcces.getResultSet().getString(2));
            usuario.setNombres(dataAcces.getResultSet().getString(3));
            usuario.setApellidos(dataAcces.getResultSet().getString(4));
            usuario.setLogin(dataAcces.getResultSet().getString(5));
            usuario.setPassword(dataAcces.getResultSet().getString(6));
            usuario.setIdRol(dataAcces.getResultSet().getInt(7));
            usuario.setActivo(dataAcces.getResultSet().getBoolean(8));
        }
        return usuario;
    }

    /**
     * Permite obtener el usuario por id
     *
     * @param id
     * @return Usuario
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public Usuario ConsultarUsuarioPorId(int id) throws ClassNotFoundException, SQLException {
        Usuario usuario = new Usuario();
        ResultSet dataSet = dataAcces.getData("SELECT id, identificacion, nombres, apellidos, login, password, idrol, activo\n" + "FROM usuario\n" + "WHERE id = '" + id + "' AND activo");
        while (dataSet.next()) {
            usuario.setId(dataAcces.getResultSet().getInt(1));
            usuario.setIdentificacion(dataAcces.getResultSet().getString(2));
            usuario.setNombres(dataAcces.getResultSet().getString(3));
            usuario.setApellidos(dataAcces.getResultSet().getString(4));
            usuario.setLogin(dataAcces.getResultSet().getString(5));
            // usuario.setPassword(dataAcces.getResultSet().getString(6));
            usuario.setIdRol(dataAcces.getResultSet().getInt(7));
            usuario.setActivo(dataAcces.getResultSet().getBoolean(8));
        }
        return usuario;
    }

    /**
     * Permite obetener todos los usuarios
     *
     * @return List<Usuario>
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<Usuario> ConsultarUsuarios() throws ClassNotFoundException, SQLException {
        List<Usuario> users = new Vector<Usuario>();
        ResultSet dataSet = dataAcces.getData("SELECT id, identificacion, nombres, apellidos, login, password, idrol, activo\n" + "FROM usuario WHERE Activo");
        while (dataSet.next()) {
            Usuario usuario = new Usuario();
            usuario.setId(dataAcces.getResultSet().getInt(1));
            usuario.setIdentificacion(dataAcces.getResultSet().getString(2));
            usuario.setNombres(dataAcces.getResultSet().getString(3));
            usuario.setApellidos(dataAcces.getResultSet().getString(4));
            usuario.setLogin(dataAcces.getResultSet().getString(5));
            usuario.setPassword(dataAcces.getResultSet().getString(6));
            usuario.setIdRol(dataAcces.getResultSet().getInt(7));
            usuario.setActivo(dataAcces.getResultSet().getBoolean(8));
            users.add(usuario);
        }
        return users;
    }

    /**
     * Permite obtener todos los roles
     *
     * @return List<Rol>
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<Rol> ConsultarRoles() throws ClassNotFoundException, SQLException {
        List<Rol> roles = new Vector<Rol>();
        ResultSet dataSet = dataAcces.getData("SELECT Id, Descripcion FROM rol");
        while (dataSet.next()) {
            Rol rol = new Rol();
            rol.setId(dataAcces.getResultSet().getInt(1));
            rol.setDescripcion(dataAcces.getResultSet().getString(2));
            roles.add(rol);
        }
        return roles;
    }

    /**
     * Permite registrar un nuevo usuario
     *
     * @param usuario
     * @return boolean
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean CrearUsuario(Usuario usuario) throws ClassNotFoundException, SQLException {
        return dataAcces.setData("INSERT INTO usuario(identificacion, nombres, apellidos, login, password, idrol, activo)\n" + "VALUES ('" + usuario.getIdentificacion() + "', '" + usuario.getNombres() + "', '" + usuario.getApellidos() + "', '" + usuario.getLogin() + "', '" + usuario.getPassword() + "', '" + usuario.getIdRol() + "', " + usuario.getActivo() + ");");
    }

    /**
     * Permite actualizar un usuario por id del mismo
     *
     * @param usuario
     * @return boolean
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean ActualizarUsuarioPorId(Usuario usuario) throws ClassNotFoundException, SQLException {
        return dataAcces.setData("UPDATE usuario\n" + "SET identificacion = '" + usuario.getIdentificacion() + "', nombres = '" + usuario.getNombres() + "', apellidos = '" + usuario.getApellidos() + "', login = '" + usuario.getLogin() + "', password = '" + usuario.getPassword() + "',\n" + " idrol = '" + usuario.getIdRol() + "', activo = " + usuario.getActivo() + "\n" + "WHERE id = '" + usuario.getId() + "'");
    }

    /**
     * Obtiene el menu autorizado a un usuario
     *
     * @param usuario
     * @return List<Menu>
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<Menu> ConsultarMenuPorUsuario(int usuario) throws ClassNotFoundException, SQLException {
        List<Menu> lstMenu = new Vector<Menu>();
        ResultSet dataSet = dataAcces.getData("SELECT menu.id, menu.titulo, menu.url, menu.idsupermenu\n" + "FROM usuario\n" + " INNER JOIN rol\n" + " ON usuario.idrol = rol.id\n" + " INNER JOIN autorizacion\n" + " ON autorizacion.idrol = rol.id\n" + " INNER JOIN menu\n" + " ON menu.id = autorizacion.idmenu\n" + "WHERE usuario.id = '" + usuario + "'\n" + "ORDER BY menu.idsupermenu, menu.id");
        while (dataSet.next()) {
            Menu menu = new MenuLeaf();
            menu.setId(dataAcces.getResultSet().getInt(1));
            menu.setTitulo(dataAcces.getResultSet().getString(2));
            menu.setUrl(dataAcces.getResultSet().getString(3));
            menu.setIdSuperMenu(dataAcces.getResultSet().getInt(4));
            lstMenu.add(menu);
        }
        return lstMenu;
    }
}